<?php
/**
 * Created by PhpStorm
 * User: ZhouFurong
 * Date: 2020/12/8
 * Time: 14:36
 */

/********************************************************************
 * Class customException
 * 需要进行异常处理的代码应该放入 try 代码块内，以便捕获潜在的异常
 * 每个 try 或 throw 代码块 必须至少拥有一个对应的 catch 代码块
 * 使用多个 catch 代码块可以捕获不同种类的异常
 * 可以在 try 代码块内的 catch 代码中再次抛出 （re-throw）异常
 *******************************************************************/

class customException extends Exception
{
    public function errorMessage()
    {
        // error message
        $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile() . '<b>' . $this->getMessage() .
            '</b>' . 'is not a valid E-mail address';
        return $errorMsg;
    }
}

$email = "dana@qq.com";

// 多个异常抛出
try {
    if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
        throw new customException($email);
    }

    if(strpos($email,'qq') !== false){
        throw new Exception("$email is an QQ e-mail");
    }

} catch (customException $e) {
    echo $e->errorMessage();
}catch (Exception $e){
    echo $e->getMessage();
}


// 重新抛出异常
try {
    try {
        if (strpos($email, "qq") !== false) {
            throw new Exception($email);
        }
    } catch (Exception $e) {
        echo "exception ......".PHP_EOL;
        echo $e->getMessage(),PHP_EOL;
        throw new customException($email);
    }
} catch (customException $e) {
    echo $e->errorMessage();
}


// 设置顶层异常处理器
// set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数

function myException($exception)
{
    echo "<b>Exception: </b>", $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');


